package entity

import (
	"time"
)

//工单实体定义
type WorkOrder struct {
	Id             int64              `xorm:"pk"`
	Title          string             //标题
	Body           string             //正文
	OpinionType    EOpinionType       //意见类型：品种类、业务类、技术类、场外平台类、市场服务类
	WorkOrderType  EWorkOrderType     //工单类型：咨询、建议、投诉
	Telephone      string             //联系电话(必填）
	Email          string             //邮箱
	ShareOrNot     bool               //是否公开，缺省false
	ChannelName    string             //反馈渠道标识：官网页面(Website)、APP版本(xx财讯通等)
	Reply          string             //回复文本
	CustomerId     int64              //留言作者的用户ID，id格式待定
	CustomerMobile string             //
	CreatedAt      time.Time          //创建时间
	FinishAt       time.Time          //办结时间
	Status         EWorkerOrderStatus //当前工单状态（新增、流转、申请延期、申请复核、办结）

	CurProcessId   int64  //当前适用流程（流程ID），id格式待定
	CurStepId      int64  //当前流转位置id，即StepID
	PrevPositionId int64  //上一步流转位置id，即StepID
	NextPositionId int64  //下一步流转位置id，即StepID
	LabelIds       string //标签ID，字符串，用分号fenge
}

//用户（投资者）实体定义
type Customer struct {
	Id               int64            `xorm:"pk"`
	Name             string           //姓名（必填）/单位名称
	Password         string           //密码
	Mobile           string           //手机（必填）
	Telephone        string           //座机（内线）
	Email            string           //邮箱
	IsOrganization   bool             //是否组织or法人，true:法人机构，false:自然人.
	CertType         ECertificateType //证件类型
	IdNumber         string           //证件号码（自然人）/ 社会信用代码（法人）
	IndustryInvolved string           //所属行业
	CeoName          string           //法人代表
	CertUrl          string           //上传件Url
	CreatedAt        time.Time        //创建用户时间
	LastLoginAt      time.Time        //最近登录时间
	Status           int              //状态：正常、注销、锁定
}

//操作员实体定义
type Operator struct {
	Id        int64     `xorm:"pk"`
	Name      string    //姓名（必填）
	Nickname  string    //昵称
	Password  string    //密码
	Mobile    string    //手机（必填）
	Telephone string    //座机（内线）
	Email     string    //邮箱
	DeptId    int       //所属部门ID（必填）
	DeptName  string    //所属部门名称
	Status    int       //当前操作员状态：正常、注销、锁定
	IsAdmin   bool      //是否具有管理员权限（必填）
	CreatedAt time.Time //创建用户时间
}

//部门实体定义
type Department struct {
	DeptId      int64     `xorm:"pk"` //部门ID（必填）
	DeptName    string    //部门名称（必填）
	Readme      string    //描述
	DeptHead    string    //部门负责人
	DeptHeadId  int64     //部门负责人ID
	OperatorIds []int64   //本部门所属操作员ID队列（可多人）
	ProcessIds  []int64   //本部门所参与的流程ID列表。有无意义待定??
	CreatedAt   time.Time //创建部门时间
}

//流程实体定义
type Process struct {
	ProcessId    int64  `xorm:"pk"` //流程ID（必填）
	ProcessName  string //流程名称（必填）
	Readme       string //流程描述
	OpinionTypes string //本流程所适用的留言类型列表,分号间隔
	//	OpinionTypes     []EOpinionType     //本流程所适用的留言类型列表
	WorkOrderTypes string //本流程所适用的工单型列表,分号间隔
	//	WorkOrderTypes	 []EWorkOrderType 	//本流程所适用的工单型列表
	StepIds string //本流程所包含的步骤ID列表（如果带有分支的流程，需要用Step内部的链表构建树形结构）,分号间隔
	//	StepIds          []int64            //本流程所包含的步骤ID列表（如果带有分支的流程，需要用Step内部的链表构建树形结构）
	CreatedAt time.Time //创建流程时间
}

//步骤实体定义（step is in process）
type Step struct {
	StepId      int64     `xorm:"pk"` //步骤ID（必填）
	StepName    string    //步骤名称（必填）
	Readme      string    //步骤描述
	DeptId      int64     //当前步骤应对部门ID，每一个步骤对应一个部门处理，一对一
	OperatorIds []int64   //当前步骤应对操作员ID列表，多项，一个部门中可能有多个操作员可以处理事务.
	NextStepIds []int64   //下一步 步骤实体ID列表。下一步可能有多个部门的选项，所以要支持分支选择。
	PrevStepId  int64     //上一步 步骤实体ID。Parent节点只有一个。
	CreatedAt   time.Time //创建步骤时间
}

//声明类信息实体定义（支持注册协议、平台声明、留言须知）
type Declaration struct {
	Id        int64            `xorm:"pk"` //步骤ID（必填）
	Text      string           //正式文本
	EngText   string           //英文文本
	Type      EDeclarationType //类型
	Describ   string           //简述
	CreatedAt time.Time        //创建时间
	EditedAt  time.Time        //修改时间
	Author    string           //作者ID
}

//友情链接实体定义（
type FriendshipLink struct {
	Id            int64     `xorm:"pk"` //步骤ID（必填）
	Title         string    //标题
	Url           string    //Url
	LogoUrl       string    //Logo Url
	CreatedAt     time.Time //创建时间
	PublishStatus int       //发布状态 0 未发布，1 已发布，2
	SortIndex     int       //图标Url
}

//操作员登录日志
type OperatorLoginLog struct {
	Id            int64     `xorm:"pk"` //步骤ID（必填）
	OperatorId    int64     //业务员Id
	LoginTime     time.Time //登录时间
	LogoutTime    time.Time //登出时间
	LoginType     int       //登录类型(密码 or 短信)
	DeviceNo      string    //设备号
	IpAddress     string    //Logo Url
	IsAdmin       int       //是否管理员权限
	LoginOrLogout int       //登入0/登出1
	ClientType    int       //客户端类型
	ClientVersion string    //客户端版本
	Token         string    //token
}

//客户登录日志
type CustomerLoginLog struct {
	Id            int64     `xorm:"pk"` //步骤ID（必填）
	CustomerId    int64     //用户Id
	LoginTime     time.Time //登录时间
	LogoutTime    time.Time //登出时间
	LoginType     int       //登录类型(密码 or 短信)
	DeviceNo      string    //设备号
	IpAddress     string    //Logo Url
	IsAdmin       int       //是否管理员权限
	LoginOrLogout int       //登入0/登出1
	ClientType    int       //客户端类型
	ClientVersion string    //客户端版本
	Token         string    //登录时搞到的token
}

type CustomerType struct {
	Id   int
	Type string
}

type OpinionType struct {
	Id   int
	Type string
}

type CertificateTypes struct {
	Id   int
	Type string
}

//标签
type Label struct {
	Id        int64     `xorm:"pk"` //ID（必填）
	Label     string    //标题
	CreatedAt time.Time //创建时间
	Remark    string    //说明
	Author    int64     //作者ID
}

//邮件
type Message struct {
	MsgId          int64     `xorm:"pk"` //ID（必填）
	Title          string    //标题
	Body           string    //正文
	Sender         string    //发送者：
	SenderId       int64     //发送者ID,
	ReceiverIdList string    //接收者ID列表，分号分隔
	SendAt         time.Time //发送时间
	Type           int       //类型 1：发送给业务员， 2，发送给客户
	Status         int       //状态 0:draft，1：send；2：delete；3:recall
}

//接收邮件的信息
type ReceivingMessage struct {
	Id         int64
	MsgId      int64 //邮件ID
	ReceiverId int64
	ReceiveAt  time.Time //接收时间
	ReadFlag   int       //1 未读，2已读
	Type       int       //类型 1：发送给业务员， 2，发送给客户
	ReadAt     time.Time //读取时间
}

//工单+标签
type WorkOrderLabel struct {
	Id          int64
	LabelId     int64
	WorkOrderId int64
	CreatedAt   time.Time
}

//工单流转记录
type WorkOrderFlow struct {
	FlowId          int64              //流转记录ID
	WorkOrderId     int64              //工单ID
	StepId          int64              //当前流程处理步骤ID
	ProcessId       int64              //当前选用的处理流程ID
	PrevFlowId      int64              //上一步流转记录ID，若为0，则是该工单的第一条记录
	WorkOrderStatus EWorkerOrderStatus //进入当前步骤处理时的工单状态
	NextFlowId      int64              //下一步流转记录ID，若为0，则是该工单的最后一条记录
	StartAt         time.Time          //创建该流程记录的时间，即当前步骤的开始时间
	EndAt           time.Time          //创建该流程记录的时间，即当前步骤的开始时间
	ElapsedTime     int                //耗时，单位：秒。end_at-start_at
	OperatorId      int                //操作员ID
}

//看板信息

type OpinionKV struct {
	Name  string `json:"name"`
	Count int    `json:"count"`
}
type KanBoard struct {
	OpinionSum   int         `json:"opinionsum" xorm:"opinionsum"`    //留言总数
	OpinionFlow  int         `json:"opinion_flow" xorm:"opinionflow"` //留言分配
	OpinionAck   int         `json:"opinion_ack" xorm:"opinionack"`   //留言
	OpinionFin   int         `json:"opinion_fin" xorm:"opinionfin"`   //留言办结
	CustomerType []OpinionKV `json:"customer_type"`                   //用户类型
	OpinionType  []OpinionKV `json:"opinion_type"`                    //留言类型
}
